<?php
/**
 * Created by PhpStorm.
 * User: wanglong
 * Date: 2017/12/14
 * Time: 21:03
 */

namespace app\modules\web\controllers\common;


use app\common\components\BaseWebController;
use app\common\services\applog\AppLogService;
use app\models\log\AppAccessLog;
use app\models\User;
use yii\helpers\Url;

/**
 * Class BaseController
 * web基本控制器会做些web端独有的工作
 * 1、指定特定布局文件
 * 2、进行统一的登录验证
 */
class BaseController extends BaseWebController
{
    protected $auth_cookie_name='imooc';

    public $current_user=null;//保存当前登录人的信息
    public $allowAction=[
        'web/user/login',
    ];
    public function __construct($id, $module, array $config = [])
    {
        parent::__construct($id, $module, $config);

        $this->layout='main';
    }

    /**
     * 登录统一验证
     * 统一拦截器
     */
    public function beforeAction($action)
    {
        //验证是否登录
        $is_login=$this->checkLoginStatus();
        if(in_array($action->getUniqueId(),$this->allowAction)){
            return true;
        }
        if(!$is_login){
            if(\Yii::$app->request->isAjax){
                $this->renderJson([],'未登录，请先登录',-302);
            }else{
                $this->redirect(Url::to(['/web/user/login']));
            }
            return false;
        }

        //记录所有用户的访问
        AppLogService::addAppAccessLog($this->current_user['uid']);
        return true;
    }

    /**
     * 验证当期登录是否有效
     * 返回布尔值 true or false
     */
    private function checkLoginStatus()
    {
        //从cookie中获取登录时所设置的cookie
        $auth_cookie=$this->getCookie($this->auth_cookie_name,'');

        if(!$auth_cookie){
            return false;
        }

        //切割加密字符串
        list($auth_token,$uid)=explode('#',$auth_cookie);

        if(!$auth_token||!$uid){
            return false;
        }

        //判断UID是否是数值
        if(!preg_match("/^\d+$/",$uid)){
            return false;
        }

        $user_info=User::find()->where(['uid'=>$uid])->one();

        if(!$user_info){
            return false;
        }

        if($auth_token != $this->genAuthToken($user_info)){
            return false;
        }

        $this->current_user=$user_info;
        return true;

    }

    /**
     * 设置登录态的方法
     * @param $user_info
     * @return string
     */
    public function setLoginStatus($user_info)
    {
        $auth_token=$this->genAuthToken($user_info);
        $this->setCookie($this->auth_cookie_name,$auth_token.'#'.$user_info['uid']);
    }

    public function removeStatus()
    {
        $this->removeCookie($this->auth_cookie_name);
    }

    /*
     * 统一生成加密字符串
     * 接收一个user对象
     */
    public function genAuthToken($user_info)
    {
        return md5($user_info['login_name'].$user_info['login_pwd'].$user_info['login_salt']);
    }

}